#pragma once

#include<vector>
#include "atom.h"

class Force{
public:
	/* <Compute_long_range_corrections> computes the forces, the virial and the potential energy of the system using the instantaneous positions.
	This is where most of the computational cost of the program lies due to the double-loop over the atoms.
	The distance histograms necessary to calculate the radial distribution function are also accumulated here.*/
	static void distance(const std::vector<double>& ri, const std::vector<double>& rj, double& dx, double& dy, double& dz, double& r);
};

class LJ_Force : public Force {
public:
	static void terms(const double& r, double& attractive_term, double& repulsive_term);
	static double force(const double& rsquare, const double& attractive_term, const double& repulsive_term);
	static double energy(const double& attractive_term, const double& repulsive_term);
	static void Compute_Forces(std::vector<Atom>& mol, double& potential_energy, double& virial);

	/**************************************************************************PIMD**************************************************************************/
	static void Compute_Forces_PIMD(std::vector< std::vector<Atom> >& mirr, std::vector<double>& rdf, std::vector<double>& potential_energy, std::vector<double>& virial);
	static std::vector< std::vector<double> > Compute_Mirror_Center(std::vector< std::vector<Atom> >& mirr);
};


